package com.showworkflow.service;

import com.deepoove.poi.XWPFTemplate;
import java.util.Map;
import com.showworkflow.util.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;

@Service
public class WordConversionService {

    private static final Logger log = LoggerFactory.getLogger(WordConversionService.class);

    @Autowired
    private word2html_pandoc wordToHtmlConverter;
    
    /**
     * 填充案件表单（适配Controller调用）
     */
    public Map<String, String> fillCaseForm(String jsonData, String templateName) throws IOException {
        // 获取项目根目录的绝对路径
        String rootPath = System.getProperty("user.dir");
        String outputPath;
        String htmlPath = null;

        // 确定输出目录路径 - 使用英文文件名避免编码问题
        if (rootPath.endsWith("backend")) {
            outputPath = "src/main/resources/generated/case_approval_" + System.currentTimeMillis() + ".docx";
            // 确保输出目录存在
            Path outputDir = Paths.get("src/main/resources/generated");
            if (!Files.exists(outputDir)) {
                Files.createDirectories(outputDir);
            }
        } else {
            outputPath = "backend/src/main/resources/generated/case_approval_" + System.currentTimeMillis() + ".docx";
            // 确保输出目录存在
            Path outputDir = Paths.get("backend/src/main/resources/generated");
            if (!Files.exists(outputDir)) {
                Files.createDirectories(outputDir);
            }
        }

        // 使用资源流的方式处理模板
        try (InputStream templateStream = getTemplateAsStream()) {
            if (templateStream == null) {
                throw new IOException("模板文件未找到，当前工作目录: " + System.getProperty("user.dir"));
            }

            // 解析JSON数据
            log.info("解析JSON数据（强制UTF-8）");
            log.info("原始JSON数据: {}", jsonData);
            String utf8Json = new String(jsonData.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
            Map<String, Object> dataMap = JsonUtils.parseJson(utf8Json);
            log.info("JSON解析完成，字段数：{}", dataMap.size());

            // 调试：打印所有键值对
            for (Map.Entry<String, Object> entry : dataMap.entrySet()) {
                log.info("字段: {} = {}", entry.getKey(), entry.getValue());
            }

            log.info("开始渲染Word模板");
            // 渲染模板
            XWPFTemplate template = null;
            try {
                template = XWPFTemplate.compile(templateStream).render(dataMap);
                log.info("模板渲染成功");

                // 生成文件
                log.info("开始写入输出文件: {}", outputPath);
                try (FileOutputStream outputOut = new FileOutputStream(outputPath)) {
                    template.write(outputOut);
                    log.info("Word生成成功（UTF-8）：{}", outputPath);
                }

                // 生成HTML版本
                try {
                    htmlPath = convertWordToHtml(outputPath);
                    log.info("HTML转换成功：{}", htmlPath);
                } catch (Exception e) {
                    log.warn("HTML转换失败，将跳过HTML生成: {}", e.getMessage());
                    // HTML转换失败不影响主要功能，继续执行
                }
            } catch (Exception e) {
                log.error("模板渲染或写入失败: {}", e.getMessage(), e);
                throw new IOException("模板处理失败: " + e.getMessage(), e);
            } finally {
                if (template != null) {
                    try {
                        template.close(); // 手动关闭模板，释放资源
                    } catch (IOException e) {
                        log.warn("关闭模板资源失败: {}", e.getMessage());
                    }
                }
            }
        }

        // 返回包含Word文档和HTML路径的结果
        Map<String, String> result = new HashMap<>();
        result.put("wordPath", outputPath);
        if (htmlPath != null) {
            result.put("htmlPath", htmlPath);
        }
        return result;
    }
    
    /**
     * 获取模板文件的输入流，支持从JAR包和文件系统中读取
     */
    private InputStream getTemplateAsStream() {
        String templateFileName = "行政处罚立案审批表模版.docx";
        
        // 方式1: 从classpath资源加载（适用于JAR包）
        InputStream resourceStream = getClass().getClassLoader().getResourceAsStream("templates/" + templateFileName);
        if (resourceStream != null) {
            log.info("从classpath资源加载模板成功");
            return resourceStream;
        }
        
        // 方式2: 尝试从文件系统加载
        try {
            String rootPath = System.getProperty("user.dir");
            Path templatePath;
            
            // 检查是否在backend目录下
            if (rootPath.endsWith("backend")) {
                templatePath = Paths.get("src/main/resources/templates/" + templateFileName);
            } else {
                templatePath = Paths.get("backend/src/main/resources/templates/" + templateFileName);
            }
            
            if (Files.exists(templatePath)) {
                log.info("从文件系统加载模板: {}", templatePath);
                return Files.newInputStream(templatePath);
            }
        } catch (IOException e) {
            log.warn("从文件系统加载模板失败: {}", e.getMessage());
        }
        
        log.error("无法找到模板文件: {}", templateFileName);
        return null;
    }

    /**
     * 将Word文档转换为HTML
     */
    private String convertWordToHtml(String wordPath) throws IOException, InterruptedException {
        // 检查word2html_pandoc是否可用
        if (!wordToHtmlConverter.checkPandocInstallation()) {
            throw new IOException("Pandoc未安装或不可用");
        }

        // 构造HTML输出路径
        String htmlPath = wordPath.replace(".docx", ".html").replace(".doc", ".html");

        // 获取HTML输出目录并确保目录存在
        Path htmlOutputPath = Paths.get(htmlPath);
        Path htmlDir = htmlOutputPath.getParent();
        if (htmlDir != null && !Files.exists(htmlDir)) {
            Files.createDirectories(htmlDir);
        }

        // 转换Word为HTML
        boolean success = wordToHtmlConverter.convertWordToHtml(
            wordPath,           // 输入Word文件路径
            htmlPath,          // 输出HTML文件路径
            null,              // 不单独提取媒体文件目录
            true,              // 生成完整的HTML文档
            false,             // 不转换数学公式为MathML
            null               // 不使用代码高亮，避免兼容性问题
        );

        if (!success) {
            throw new IOException("Word到HTML转换失败");
        }

        return htmlPath;
    }

    /**
     * 填充Word模板（兼容所有POI-tl版本，彻底解决中文乱码）
     * 此方法保留用于向后兼容，但不再使用
     */
    @Deprecated
    public void fillCaseApprovalForm(String jsonData, String templatePath, String outputPath) throws IOException {
        throw new UnsupportedOperationException("此方法已不再使用，请使用fillCaseForm方法");
    }
}
    